#include "File.h"
#include "Exception.h"
#include "Player.h"
#include <sstream>
#include <windows.h>

/**
Constructor
@param[in]	path	chemin du fichier
@param[in]	name	nom du fichier
*/
File::File(const std::wstring &path, const std::wstring &name)
{
	::OutputDebugString(L"File::File() - ");
	::OutputDebugString( name.c_str() );
	::OutputDebugString(L"\n");
	_path = path;
	_name = name;
	_scan = false;
}

/**
descructeur
*/
File::~File(void)
{
	::OutputDebugString(L"File::~File");
}

/**
@return le chemin + le nom du fichier (wide-char)
*/
const std::wstring File::wgetFullPath() const
{
	return ( _path + _name );
}

/**
@return le chemin + le nom du fichier
*/
const std::string File::getFullPath() const
{
	return wstringTostring( wgetFullPath() );
}

/**
@return le nom du fichier
*/
const std::wstring& File::getName() const
{
	return _name;
}

/**
@return le nombre de tag MP3 pour ce fichier
*/
int File::getNbTag()
{
	::OutputDebugString(L"File::getNbTag");
	scan();
	return _tags.size();
}

/**
Recupere les tags pour ce fichier
*/
void File::scan()
{
	::OutputDebugString(L"File::scan");
	if ( _scan )
		return ;

	Player::getInstance()->load( getFullPath() );
	int nb = Player::getInstance()->getNumTagFields();
	for( int i=0; i<nb; i++)
	{
		_tags.insert( Player::getInstance()->getTag(i) );
	}
	Player::getInstance()->close();
	_scan = true;
}

/**
@param[in]	title identifiant d'un tag
@return un tag par son identifiant (wide-char)
*/
const std::wstring File::getTag(const std::string& title)
{
	scan();
	std::map<std::string,std::string>::const_iterator it = _tags.find(title);
	if ( it != _tags.end() )
		return stringTowstring((*it).second);
	return L"";
}

/**
@param[in]	title identifiant d'un tag
@return un tag par son identifiant
*/
const std::string File::getTagA(const std::string& title)
{
	scan();
	std::map<std::string,std::string>::const_iterator it = _tags.find(title);
	if ( it != _tags.end() )
		return (*it).second;
	return "";
}

/**
@return l'extention d'un fichier
*/
std::wstring File::getExtention(void)
{
	int pos = _name.find_last_of(L'.');
	if ( pos == std::wstring::npos )
		return L"";
	return _name.substr( pos, _name.size() - pos );
}

/**
Joue le MP3 sur la sortie audio
*/
void File::play()
{
	::OutputDebugString(L"File::play");
	Player::getInstance()->load( getFullPath() );
	Player::getInstance()->play();
}

/**
@return les tags pour ce fichier
*/
std::map<std::string, Item> File::getInfo()
{
	std::map<std::string, Item> ret;
	ret[ "ARTIST" ] = getTagA("ARTIST");
	ret[ "ALBUM" ] = getTagA("ALBUM");
	ret[ "SONG" ] = getTagA("SONG");
	ret[ "YEAR" ] = getTagA("YEAR");
	ret[ "COMMENT" ] = getTagA("COMMENT");
	ret[ "GENRE" ] = getTagA("GENRE");
	return ret;
}

/**
Arret de la lecture du MP3
*/
void File::stop()
{
	::OutputDebugString(L"File::stop");
	Player::getInstance()->stop();
	Player::getInstance()->close();
}